package com.interpreter.interpreter;

import java.util.HashMap;
import java.util.Stack;

/**
 * 计算器类，用于将a+b-c
 * 一层一层的替换为 表达式类
 * a -> varExp(a)
 * varExp(a) +b  => addExp(varExp(a) , varExp(b) )
 * addExp(varExp(a) , varExp(b)) -c =>   addExp(addExp(varExp(a) , varExp(b)) , varExp(c))
 *
 * 这样一层层的包裹起来，
 * 在栈 里面存储的要么是空，要么是一个元素 ，varExp(a)  ， addExp(varExp(a) , varExp(b)) ， addExp(addExp(varExp(a) , varExp(b)) , varExp(c))
 */
public class Calculator {

    //定义表达式
    private Expression expression;

    public Calculator(String expStr) { //
        //安排运算的先后顺序
        Stack<Expression> stack = new Stack<>();
        //都变成一个个的字符
        char[] charArray = expStr.toCharArray();

        Expression left = null;
        Expression right = null;
        //a+b-c => [a,+,b,-,c]
        for (int i = 0; i < charArray.length; i++) {
            switch (charArray[i]) {
                case '+': //遇到+号
                    left = stack.pop(); //弹出栈中的值，并获取到这个值
                    right = new VarExpression(String.valueOf(charArray[++i])); //取出右边的表达式 b //注意这是先赋值再+1 ， 因为for循环里面还+了一,所以再次循环的时候会跳过右边的第一个值
                    stack.push(new AddExpression(left, right)); //根据left和right构建addExpression
                    break;
                case '-'://遇到减号
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(charArray[++i]));  //注意这是先赋值再+1 ， 因为for循环里面还+了一,所以再次循环的时候会跳过-号后面的值
                    stack.push(new SubExpression(left, right));
                    break;
                default://如果遇到的是一个变量  床看你
                    stack.push(new VarExpression(String.valueOf(charArray[i]))); //如果是变量就不在+1 ，
                    break;
            }
        }
        //当遍历完整个charrArray后，从栈中的得到最终的Expression ，此时的Expression是一层层的
        this.expression = stack.pop();
    }

    public int run(HashMap<String, Integer> argMap) {
        //将最终的额表达式和var绑定，
        return this.expression.interpreter(argMap);
    }

}
